#ifndef DOUBLY_NODE_H_
#define DOUBLY_NODE_H_

#include "Node.hh"

//
/**
 * \file DoublyNode.hh
 * \author  jsk <jsk.jinsubkim@gmail.com>
 * \version 1.0
 *
 * \class DoublyNode DoublyNode.hh
 *
 * 양방향 - 윈쪽과오른쪽 - 으로 노드를 연결한다.
 * 즉, 한 노드 A가 다른 노드 B를 연결할 경우 노드 B 역시 노드 A를 연결된다.
 */
class DoublyNode : public Node
{
public:
	/**
	 * \name DoublyNode
	 */
	DoublyNode();
	
	/**
	 * \name ~DoublyNode
	 */
	virtual ~DoublyNode();
	
	/**
	 * \name linkLeft
	 * \param Node 연결될 노드.
	 * 
	 * 지정된 노드를 윈쪽에 연결한다.
	 * 
	 * \warning
	 * 
	 * 파라메터를 통해서 전달된 노드의 연결은 초기화 된다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf linkLeft(Node* Node);
	
	/**
	 * \name linkRight
	 * \param Node 연결될 노드.
	 * 
	 * 지정된 노드를 오른쪽에 연결한다.
	 * 
	 * \warning
	 * 
	 * 파라메터를 통해서 전달된 노드의 연결은 초기화 된다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf linkRight(Node* Node);
	
	/**
	 * \name unlink
	 * 
	 * 노드의 연결을 해제한다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf unlink();
	
	/**
	 * \name attach
	 * \param Object 노드와 연결될 오브젝트.
	 * 
	 * 노드와 결합되는 오브젝트.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf attach(void* Obj);
	
	/**
	 * \name setLeft
	 * \param Node 새로운 윈쪽 노드.
	 * 
	 * 윈쪽 노드를 변경한다.
	 * 만약 실패하면 윈쪽 노드는 변경되지 않는다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf setLeft(Node* Node);
	
	/**
	 * \name setRight
	 * \param Node 새로운 오른쪽 노드.
	 * 
	 * 오른쪽 노드를 변경한다.
	 * 만약 실패하면 오른쪽 노드는 변경되지 않는다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf setRight(Node* Node);
	
	/**
	 * \name tellObject
	 * 
	 * 노드의 데이터를 알려준다.
	 * 
	 * \return 
	 * 
	 * 데이터의 주소, 
	 * 데이터가 없을 경우 NULL.
	 */
	virtual void* tellObject();
	
	/**
	 * \name tellLeft
	 * 
	 * 윈쪽으로 연결된 노드를 알려준다.
	 * 
	 * \return 
	 * 
	 * 윈쪽에 연결된 노드가 있을 경우 해당 노드의 주소, 
	 * 연결된 노드가 없을 경우 NULL.
	 */
	virtual Node* tellLeft();
	
	/**
	 * \name tellRight
	 * 
	 * 오른쪽으로 연결된 노드를 알려준다.
	 * 
	 * \return 
	 * 
	 * 오른쪽에 연결된 노드가 있을 경우 해당 노드의 주소,
	 * 연결된 노드가 없을 경우 NULL.
	 */
	virtual Node* tellRight();
	
	// Member
protected:
	/**
	 * 연결 링크.
	 */
	Node* Left;
	Node* Right;
	
	/**
	 * 오브젝트의 주소.
	 */
	void* Object;
};

#endif //DOUBLY_NODE_H_